package org.example.com.pattern.create.factory_method

/**
 * 创建行模式-工厂方法模式
 * 可以针对不同的场景共享创建逻辑，适用于创建单一维度产品的场景
 * 1.抽象的产品接口
 * 2.抽象的工厂接口
 * 3.
 */

interface Dialog {
    fun createButton(): Button
    fun render() {
        val button = createButton()
        button.onClick()
        button.render()
    }
}

interface Button {
    fun render()
    fun onClick()
}

class WindowButton : Button {
    override fun render() {
        println("渲染Window样式按钮...")
    }

    override fun onClick() {
        println("点击了Window样式按钮!")
    }
}

class HTMLButton : Button {
    override fun render() {
        println("渲染HTML样式按钮...")
    }

    override fun onClick() {
        println("点击了HTML样式按钮!")
    }

}

class WindowDialog : Dialog {
    override fun createButton(): Button {
        return WindowButton()
    }
}

class HTMLDialog : Dialog {
    override fun createButton(): Button {
        return HTMLButton()
    }
}

class Application {
    fun createDialog(platform: String): Dialog {
        return when (platform) {
            "Windows" -> {
                WindowDialog()
            }

            "Web" -> {
                HTMLDialog()
            }

            else -> throw IllegalArgumentException("error! 未知的操作系统!")
        }
    }
}

fun main() {
    val app = Application()
    app.createDialog("Windows").render()
    app.createDialog("Web").render()
}